  10 REM ***********************
  20 REM ** ZX RPN CALCULATOR **
  30 REM J.R.WATERMAN MARCH 2017
  40 REM ***********************
  50 REM * ZX81 BRAIN VERSION **
  60 REM ***********************
  70 REM 
  80 REM **** SCREEN SETUP *****
  90 CLEAR 63999
 100 LOAD "digichrs"CODE 64000,768
 110 BORDER 0: PAPER 0: INK 2: BRIGHT 0: CLS 
 120 REM DRAW LOGO
 130 RESTORE 230
 140 FOR n=1 TO 10
 150 READ x: READ y: PLOT x,y: DRAW 15,0: PLOT x,y-1: DRAW 15,0
 160 NEXT n
 170 FOR n=1 TO 9
 180 READ x: READ y: PLOT x,y: DRAW 0,-9: PLOT x+1,y: DRAW 0,-9
 190 NEXT n
 200 FOR n=1 TO 7
 210 READ x: READ y: PLOT x,y: PLOT x+1,y: PLOT x,y-1: PLOT x+1,y-1
 220 NEXT n
 230 DATA 14,169,14,165,14,161,36,169,54,169,54,161,76,169,76,165,76,161,98,169
 240 DATA 32,169,36,169,50,169,54,169,72,173,72,169,90,169,94,169,98,169
 250 DATA 14,167,28,163,32,173,76,163,90,167,90,163,94,173
 260 PLOT 14,157: DRAW 2,0: DRAW 0,-1: DRAW -2,-2: DRAW 0,-1: DRAW 2,0
 270 FOR n=153 TO 156 STEP 3: PLOT 18,n: DRAW 0,1: PLOT 21,n: DRAW 0,1: NEXT n: 
PLOT 19,155: DRAW 1,0
 280 PLOT 23,154: PLOT 23,156
 290 RESTORE 390: FOR n=1 TO 14: READ x: PLOT x,153: DRAW 0,4: NEXT n
 300 PLOT 39,153: DRAW 0,1: PLOT 57,153: DRAW 0,1: PLOT 113,153: DRAW 0,1
 310 FOR n=1 TO 6: READ x: PLOT x,153: DRAW 0,3: NEXT n
 320 PLOT 49,156: DRAW 1,-1: PLOT 65,156: DRAW 1,-1
 330 PLOT 80,153: DRAW 1,0: PLOT 88,153: DRAW 1,0: PLOT 93,153: DRAW 1,0
 340 PLOT 87,154: DRAW 0,3: PLOT 90,154: DRAW 0,3
 350 PLOT 101,157: DRAW 2,0: PLOT 108,154: DRAW 0,2
 360 FOR n=1 TO 9: READ x: PLOT x,155: DRAW 1,0: DRAW 1,1: DRAW -1,1: DRAW -1,0:
 NEXT n
 370 PLOT 24,153: DRAW 1,0: DRAW 1,1: PLOT 32,153: DRAW 1,0: DRAW 1,1
 380 FOR n=1 TO 3: READ x: PLOT x,153: DRAW -1,0: DRAW -1,1: DRAW 0,2: DRAW 1,1:
 DRAW 1,0: NEXT n
 390 DATA 28,31,36,46,48,51,54,59,64,67,79,92,102,110
 400 DATA 41,44,74,77,96,99
 410 DATA 24,32,37,42,55,60,75,97,111
 420 DATA 72,85,107
 430 REM DRAW KEYS
 440 INK 7
 450 FOR x=8 TO 104 STEP 24
 460 FOR y=24 TO 144 STEP 24
 470 PLOT x,y: DRAW 15,0: DRAW 1,-1: DRAW 0,-15: DRAW -1,-1: DRAW -15,0: DRAW -1
,1: DRAW 0,15
 480 PRINT PAPER 7;AT (176-y)/8,x/8;"  ";AT (184-y)/8,x/8;"  "
 490 NEXT y: NEXT x
 500 INK 0
 510 PRINT AT 12,18;"0";AT 9,18;"1  2  3";AT 6,18;"4  5  6";AT 3,18;"7  8  9"
 520 FOR x=145 TO 193 STEP 24
 530 FOR y=73 TO 145 STEP 24
 540 FOR m=0 TO 5: FOR n=0 TO 5
 550 IF POINT (x+m,y+n)=1 THEN PLOT x+m-132,y+n-60
 560 NEXT n: NEXT m: NEXT y: NEXT x
 570 PRINT AT 12,18;" ";AT 9,18;"       ";AT 6,18;"       ";AT 3,18;"       "
 580 PAPER 7
 590 PRINT AT 11,10;"N";AT 11,13;"H";AT 14,10;"B";AT 14,13;"V";AT 17,10;"K";AT 1
7,13;"J";AT 20,4;"M";AT 20,7;"X";AT 20,10;"C"
 600 PRINT AT 5,1;"I";AT 5,4;"R";AT 5,7;"G";AT 5,10;"S";AT 5,13;"P";AT 8,1;"A";A
T 8,4;"Z";AT 8,7;"Q";AT 8,10;"W";AT 8,13;"E"
 610 PLOT 108,13: DRAW -3,0: DRAW 0,5: DRAW 3,0: PLOT 106,16: DRAW 1,0: PLOT 110
,13: DRAW 0,5: DRAW 3,-5: DRAW 0,5: PLOT 117,13: DRAW 0,5: DRAW 2,0: DRAW -4,0
 620 INK 2
 630 PRINT AT 10,14;"^";AT 16,11;"+";AT 13,14;"-";AT 16,14;"-";AT 19,5;"."
 640 PLOT 90,65: DRAW 4,4: PLOT 94,65: DRAW -4,4: PLOT 116,65: PLOT 116,69
 650 PLOT 89,89: DRAW 4,4: PLOT 92,89: DRAW 2,0: PLOT 89,92: DRAW 0,2: DRAW -1,-
1: DRAW 2,0
 660 PLOT 59,18: DRAW -2,0: DRAW 0,4: DRAW 2,0: PLOT 58,20: DRAW 1,0: PLOT 61,18
: DRAW 4,4: PLOT 65,18: DRAW -4,4: PLOT 67,18: DRAW 0,4: DRAW 2,0: DRAW 1,-1: DR
AW -1,-1: DRAW -1,0
 670 PLOT 84,18: DRAW -2,0: DRAW -1,1: DRAW 0,2: DRAW 1,1: DRAW 2,0: PLOT 86,22:
 DRAW 0,-4: DRAW 3,0: PLOT 91,18: DRAW 0,4: DRAW 2,0: DRAW 1,-1: DRAW -1,-1: DRA
W -1,0: PLOT 94,18: DRAW 0,1
 680 PLOT 10,138: DRAW 0,4: PLOT 12,138: DRAW 0,4: DRAW 4,-4: DRAW 0,4: PLOT 20,
138: DRAW -2,4: PLOT 20,138: DRAW 2,4
 690 PLOT 34,138: DRAW 2,0: DRAW -1,0: DRAW 0,4: DRAW -1,-1: PLOT 38,137: DRAW 2
,5: PLOT 42,137: DRAW 4,4: PLOT 46,137: DRAW -4,4
 700 PLOT 57,138: DRAW 0,3: DRAW 2,1: DRAW 1,-1: DRAW 0,-3: PLOT 58,140: DRAW 1,
0: PLOT 62,138: DRAW 0,4: DRAW 2,0: DRAW 1,-1: DRAW -2,-1: DRAW 1,0: DRAW 1,-1: 
DRAW -2,-1: PLOT 67,138: DRAW 2,0: DRAW 1,1: DRAW -2,1: DRAW -1,1: DRAW 1,1: DRA
W 2,0
 710 PLOT 88,140: DRAW 1,-3: DRAW 1,4: DRAW 1,1: DRAW 3,0
 720 PLOT 114,141: DRAW 4,0: PLOT 115,138: DRAW 0,2: PLOT 117,138: DRAW 0,2
 730 PLOT 9,118: DRAW 0,-3: DRAW 1,-1: DRAW 2,3: DRAW 1,-2: DRAW -1,-1: PLOT 16,
115: DRAW -1,1: DRAW 2,1: DRAW 0,-3: DRAW -2,-1: PLOT 19,113: DRAW 0,3: PLOT 22,
113: DRAW 1,2: DRAW -1,1: DRAW -1,-2
 740 PLOT 40,118: DRAW 0,-3: DRAW 1,-1: PLOT 43,114: DRAW 0,3: DRAW 2,0: DRAW 1,
-1: DRAW 0,-2
 750 PLOT 59,114: DRAW 2,0: DRAW 1,1: DRAW -2,1: DRAW -1,1: DRAW 1,1: DRAW 2,0: 
PLOT 64,114: DRAW 0,4: PLOT 66,114: DRAW 0,4: DRAW 4,-4: DRAW 0,4
 760 PLOT 84,114: DRAW -2,0: DRAW -1,1: DRAW 0,2: DRAW 1,1: DRAW 2,0: PLOT 88,11
4: DRAW -1,0: DRAW -1,1: DRAW 0,2: DRAW 2,1: DRAW 1,-1: DRAW 0,-2: PLOT 91,114: 
DRAW 2,0: DRAW 1,1: DRAW -2,1: DRAW -1,1: DRAW 1,1: DRAW 2,0
 770 PLOT 106,114: DRAW 0,3: DRAW -1,1: DRAW 2,0: PLOT 109,114: DRAW 0,3: DRAW 2
,1: DRAW 1,-1: DRAW 0,-3: PLOT 110,116: DRAW 1,0: PLOT 114,114: DRAW 0,4: DRAW 4
,-4: DRAW 0,4
 780 REM DRAW STACK
 790 PAPER 0
 800 FOR n=0 TO 3
 810 PLOT 140+n,2: DRAW 0,171: PLOT 248+n,2: DRAW 0,171
 820 PLOT 144,2+n: DRAW 103,0: PLOT 144,18+n: DRAW 103,0: PLOT 144,154+n: DRAW 1
03,0: PLOT 144,170+n: DRAW 103,0
 830 NEXT n
 840 PRINT AT 1,22; INK 7;"STACK"
 850 POKE 23607,249
 860 PRINT AT 20,30;"0"
 870 POKE 23607,60
2000 REM 
2010 REM ***********************
2020 REM * SET KEYBOARD ARRAY **
2030 REM ***********************
2040 DIM k(90)
2050 DIM p(8)
2060 RESTORE 2150
2070 REM - ENTER KEY
2080 LET k(13)=23149
2090 REM - NUMBER KEYS
2100 FOR n=48 TO 57
2110 READ x: LET k(n)=x: NEXT n
2120 REM - LETTER KEYS
2130 FOR n=65 TO 90
2140 READ x: LET k(n)=x: NEXT n
2150 DATA 23137,23041,23044,23047,22945,22948,22951,22849,22852,22855
2160 DATA 22753,22954,23146,0,22765,0,22663,22861,22657,23053,23050,0,23140,2285
8,0,22669,22759,22660,22666,0,0,22957,22762,23143,0,22756
2170 REM SET OTHER VALUES
2180 PAPER 0: INK 2: BRIGHT 1
2190 POKE 23658,8
2200 DIM s(17): LET s(1)=0
2210 LET kp=0: LET s$="": LET d=0: LET e=0: LET v=0: LET z=1
2220 LET b$="            0"
2230 POKE 23607,249: PRINT AT 20,18;b$: POKE 23607,60
2240 REM 
2250 REM ****** MAIN BODY ******
2260 REM 
2270 REM LOOK FOR KEYPRESS
2280 IF v=1 THEN GO SUB 3580
2290 IF v=0 THEN GO SUB 3620
2300 LET i=CODE INKEY$
2310 IF i=13 OR (i>47 AND i<58) OR (i>=65 AND i<=67) OR i=69 OR (i>=71 AND i<=75
) OR i=77 OR i=78 OR (i>=80 AND i<=83) OR (i>=86 AND i<=88) OR i=90 THEN LET kp=
1
2320 IF kp=1 AND i<>73 THEN GO SUB 3440
2330 IF (i>47 AND i<58) OR i=77 OR i=88 THEN GO SUB 2420
2340 IF i=13 THEN GO SUB 2630
2350 IF i=67 THEN GO SUB 2760
2360 IF i=66 OR i=72 OR i=74 OR i=75 OR i=86 THEN GO SUB 2880
2370 IF i=80 THEN GO SUB 2820
2380 IF i=65 OR i=69 OR i=71 OR i=78 OR (i>=81 AND i<=83) OR i=87 OR i=90 THEN G
O SUB 3110
2390 IF i=73 AND v<>1 THEN BEEP .05,8: GO SUB 3580
2400 IF kp=1 AND i<>73 THEN GO SUB 3530
2410 GO TO 2240
2420 REM NUMBER/DOT/EXP PRESSED
2430 IF s$="" AND i=48 THEN BEEP .1,-24: RETURN 
2440 IF i=77 AND d=1 THEN BEEP .1,-24: RETURN 
2450 IF i=77 AND d=0 THEN LET s$=s$+".": LET d=1
2460 IF i=88 AND e=1 THEN BEEP .1,-24: RETURN 
2470 IF i=88 AND s$="" THEN BEEP .1,-24: RETURN 
2480 IF i=88 AND s$="0." THEN BEEP .1,-24: RETURN 
2490 IF i=88 AND v<>1 AND e=0 THEN LET s$=s$+"E+": LET d=1: LET e=1
2500 IF i=88 AND v=1 AND e=0 THEN LET s$=s$+"E-": LET d=1: LET e=1
2510 IF i<>77 AND i<>88 THEN LET s$=s$+CHR$ i
2520 IF s$="." THEN LET s$="0."
2530 LET l=LEN s$
2540 IF l>13 THEN BEEP .1,-24: LET s$=s$(1 TO 13): LET l=13
2550 POKE 23607,249
2560 PRINT AT 20,31-l;s$
2570 IF s$="" THEN PRINT AT 20,30;"0": LET s(1)=0: POKE 23607,60: RETURN 
2580 IF s$(l)="." THEN LET s(1)=VAL s$( TO l-1): POKE 23607,60: RETURN 
2590 IF s$(l)="+" OR s$(l)="-" THEN LET s(1)=VAL s$( TO l-2): POKE 23607,60: RET
URN 
2600 LET s(1)=VAL s$
2610 GO SUB 3620
2620 POKE 23607,60: RETURN 
2630 REM ENTER NUMBER ONTO STACK
2640 IF z=17 THEN BEEP .1,-24: RETURN 
2650 LET z=z+1
2660 FOR n=z TO 2 STEP -1: LET s(n)=s(n-1): NEXT n
2670 LET s(1)=0: LET s$="": LET d=0: LET e=0: LET f=0
2680 FOR n=2 TO z
2690 LET lz=LEN (STR$ s(n))
2700 POKE 23607,249
2710 PRINT AT 20-n,18;b$( TO 13-lz);AT 20-n,31-lz;s(n)
2720 NEXT n
2730 PRINT AT 20,18;b$
2740 GO SUB 3620
2750 POKE 23607,60: RETURN 
2760 REM CLEAR ENTRY
2770 LET s$="": LET s(1)=0: LET d=0: LET e=0: LET f=0
2780 POKE 23607,249
2790 PRINT AT 20,18;b$
2800 GO SUB 3620
2810 POKE 23607,60: RETURN 
2820 REM PI
2830 IF s$<>"" THEN BEEP .1,-24: RETURN 
2840 LET s$="3.1415926536": LET s(1)=PI: LET d=1
2850 POKE 23607,249: PRINT AT 20,19;s$
2860 GO SUB 3620
2870 POKE 23607,60: RETURN 
2880 REM ARITHMETIC OPERATIONS
2890 IF z=1 THEN BEEP .1,-24: RETURN 
2900 IF i=86 AND s(1)=0 THEN BEEP .1,-24: RETURN 
2910 IF i=75 THEN LET o=s(2)+s(1)
2920 IF i=74 THEN LET o=s(2)-s(1)
2930 IF i=66 THEN LET o=s(2)*s(1)
2940 IF i=86 THEN LET o=s(2)/s(1)
2950 IF i=72 THEN LET o=s(2)^s(1)
2960 LET s(1)=o: LET s$=STR$ o
2970 IF o<>INT o THEN LET d=1
2980 IF o>=1e8 THEN LET d=1: LET e=1
2990 IF o=INT o AND e<>1 THEN LET d=0
3000 POKE 23607,249
3010 LET lz=LEN (STR$ s(1)): PRINT AT 20,18;b$( TO 13-lz);AT 20,31-lz;s(1)
3020 FOR n=2 TO z-1: LET s(n)=s(n+1): NEXT n
3030 LET s(z)=0: LET z=z-1
3040 FOR n=2 TO z
3050 LET lz=LEN (STR$ s(n))
3060 PRINT AT 20-n,18;b$( TO 13-lz);AT 20-n,31-lz;s(n)
3070 NEXT n
3080 PRINT AT 19-z,18;"             "
3090 GO SUB 3620
3100 POKE 23607,60: RETURN 
3110 REM SINGLE VALUE OPERATIONS
3120 LET l=LEN s$
3130 IF i=78 AND SGN s(1)=0 THEN BEEP .1,-24: RETURN 
3140 IF i=78 AND SGN s(1)=1 AND l=13 THEN BEEP .1,-24: RETURN 
3150 IF i=78 THEN LET o=-s(1)
3160 IF (i=65 OR i=90) AND v<>1 AND SGN s(1)<>1 THEN BEEP .1,-24: RETURN 
3170 IF i=65 AND v<>1 AND SGN s(1)=1 THEN LET o=(LN s(1))/(LN 10)
3180 IF i=65 AND v=1 THEN LET o=10^(s(1))
3190 IF i=90 AND v<>1 AND SGN s(1)=1 THEN LET o=LN s(1)
3200 IF i=90 AND v=1 THEN LET o=EXP s(1)
3210 IF (i=81 OR i=87) AND v=1 AND (s(1)<-1 OR s(1)>1) THEN BEEP .1,-24: RETURN 
3220 IF i=81 AND v<>1 THEN LET o=SIN s(1)
3230 IF i=81 AND v=1 AND (s(1)>=-1 AND s(1)<=1) THEN LET o=ASN s(1)
3240 IF i=87 AND v<>1 THEN LET o=COS s(1)
3250 IF i=87 AND v=1 AND (s(1)>=-1 AND s(1)<=1) THEN LET o=ACS s(1)
3260 LET ot=(s(1)+(PI/2))/PI
3270 IF i=69 AND v<>1 AND ot=INT ot THEN BEEP .1,-24: RETURN 
3280 IF i=69 AND v<>1 AND ot<>INT ot THEN LET o=TAN s(1)
3290 IF i=69 AND v=1 THEN LET o=ATN s(1)
3300 IF i=82 AND s(1)=0 THEN BEEP .1,-24: RETURN 
3310 IF i=82 AND s(1)<>0 THEN LET o=1/s(1)
3320 IF i=71 THEN LET o=ABS s(1)
3330 IF i=83 AND SGN s(1)=-1 THEN BEEP .1,-24: RETURN 
3340 IF i=83 AND SGN s(1)<>-1 THEN LET o=SQR s(1)
3350 IF i=83 AND v=1 THEN LET o=s(1)^2
3360 LET s(1)=o: LET s$=STR$ o
3370 IF o<>INT o THEN LET d=1
3380 IF 0>=1e8 THEN LET d=1: LET e=1
3390 IF o=INT o AND e<>1 THEN LET d=0
3400 POKE 23607,249
3410 LET lz=LEN (STR$ s(1)): PRINT AT 20,18;b$( TO 13-lz);AT 20,31-lz;s(1)
3420 GO SUB 3620
3430 POKE 23607,60: RETURN 
3440 REM HIGHLIGHT KEY PRESSED
3450 IF i=0 THEN RETURN 
3460 LET p(1)=PEEK k(i): LET p(5)=p(1)+64
3470 LET p(2)=PEEK (k(i)+1): LET p(6)=p(2)+64
3480 LET p(3)=PEEK (k(i)+32): LET p(7)=p(3)+64
3490 LET p(4)=PEEK (k(i)+33): LET p(8)=p(4)+64
3500 POKE k(i),p(5): POKE k(i)+1,p(6): POKE k(i)+32,p(7): POKE k(i)+33,p(8)
3510 BEEP .05,8
3520 RETURN 
3530 REM DEHIGHLIGHT KEY PRESSED
3540 IF i=0 THEN RETURN 
3550 POKE k(i),p(1): POKE k(i)+1,p(2): POKE k(i)+32,p(3): POKE k(i)+33,p(4)
3560 LET kp=0
3570 RETURN 
3580 REM INVERSE ON
3590 POKE 22657,122: POKE 22658,122: POKE 22689,120: POKE 22690,120
3600 LET v=1
3610 RETURN 
3620 REM CANCEL INVERSE
3630 POKE 22657,58: POKE 22658,58: POKE 22689,56: POKE 22690,56
3640 LET v=0
3650 RETURN 
